#ifndef KOMUNIKATOR_H
#define KOMUNIKATOR_H

#include"definicje.h"
#include<stdbool.h>
#include<stdint.h>
#include<sys/types.h>
#include<sys/socket.h>

#include<openssl/ssl.h>
#include<openssl/bio.h>


struct komunikator
{
   struct sockaddr_storage *adres;
   int gniazdo;
   BIO *bio;
   BIO *bio2;
   SSL *ssl;

};

int usunKomunikator(struct komunikator *k);

int dodajKomunikator(struct komunikator *nowy);

int oczekujNaKomunikaty(struct komunikator ***k,unsigned int *ilosc);

int przyjmijKomunikat(
      struct komunikator *k,
      struct sockaddr_storage **adres,
      int8_t **bufor
      );

int znajdzKomunikator(struct sockaddr_storage *adres,struct komunikator **kom);

int wyslijKomunikat(struct komunikator *kom, struct sockaddr_storage *adres,int8_t *bufor);

#ifdef DEBUG
   void wypiszKomunikatory(void);
#endif

//struct komunikator nowykomunikator(void);
//void usunkomunikator(struct komunikator*)
//int kdodajkomunikator(struct komunikator);
//int kusunkomunikator(


/*
 * 1. Serwer otwiera gniazdo nasluchujace.
 * 2. Serwer tworzy nowy komunikator na danym gnieździe. Oznacza go jako
 * komunikator zewnętrzny. Komunikator jest dodawany do listy przy tworzeniu.
 * 2. Serwer nasłuchuje na komunikatorach.
 * 3. Mamy zbiór G gniazd. Serwer czeka aż stan któregoś gniazda się zmieni,
 * zbiór Z to zbiór gniazd o zmienionym stanie. Przed nasłuchiwaniem jest on
 * pusty, po wyjściu z procedury nasłuchującej zawiera gniazda na których
 * znajdują się oczekujące dane
 * 4. Dla każego gniazda w Z serwer wywołuje metodę pobierzwyślij.
 * Metoda ta pobiera komunikat z podanego gniazda,
 * sprawdza adres zrodlowy komunikatu i przesyla komunikat
 * do okreslonego komunikatora. Jeśli adres komunikatu nie znajduje
 * się na liście to tworzony jest nowy watek, nowe gniazdo,
 * wątek dostaje gniazdo i przesyłany jest odpowiedni komunikat
 * już do nowego wątku
 *
 */

/*
 * Z punktu widzenia wątku nasłuchuje on na gnieździe. Jeżeli coś przyjdzie, to
 * traktuje on obiekt jako liczbę wskazującą na dane pakietu.
 * Jeśli chce on coś wysłać tworzy nowy obiekt w pamięci z danymi pakietu
 * i wysyła adres na jego gniazdo.
 */













#endif
